package edu.pitt.cs.cs2410pj2.datamodel;

import java.util.ArrayList;

import edu.pitt.cs.cs2410pj2.core.Tile;
import edu.pitt.cs.cs2410pj2.util.Parameters;
import edu.pitt.cs.cs2410pj2.util.TileDistCounter;

/**
 * Keeps a list of messages sent
 * 
 * Basically in our design, everything is passed as message, including traces
 * 
 * @author zhangfan
 * 
 */
public class MessageBus {
	private Parameters para;
	private ArrayList<Message> messageList;
	private ArrayList<Tile> tiles;

	int clock;

	public MessageBus(ArrayList<Tile> tiles, Parameters para) {
		this.para = para;
		messageList = new ArrayList<Message>();
		setTiles(tiles);
		clock = 0;
	}

	public MessageBus() {
		clock = 0;
	}

	public void setTiles(ArrayList<Tile> tiles) {
		this.tiles = tiles;
	}

	// On each second, moves the messages on the list by one second
	public void tick() {
		for(int i = 0;i<messageList.size();i++) {
			if(messageList.get(i).getTimeOnRoad()==-1) {
				messageList.remove(messageList.get(i));
			}
		}
		for (int i = 0; i < messageList.size(); i++) {
			Message msg = messageList.get(i);

			if (msg.getTimeOnRoad() == 0) {
				// Inform the listener
				if (tiles.get(msg.getTo()).receiveMsg(msg, clock) == true) {
					msg.setTimeOnRoad(-1);
				} else {
					msg.setWaiting(true);
				}
			} else {
				if (msg.getTimeOnRoad() > 0) {
					// msg.setTimeOnRoad(msg.getTimeOnRoad() - 1);
					msg.move();
				}

			}
		}
		clock++;
	}

	public void sendMessage(Message msg) {
		if (msg.getType() == MessageType.L2LOAD) {
			msg.setTimeOnRoad(para.d1);
		} else {
			// Get the manhaton distance out
			int dist = TileDistCounter.calculateDist(msg.getFrom(),
					msg.getTo(), para.p);
			msg.setTimeOnRoad(para.C * dist + msg.getTimeOnRoad());
		}
		this.messageList.add(msg);
	}

	public String toString() {
		String msg = "";
		for (int i = 0; i < messageList.size(); i++) {
			//if(messageList.get(i).getTimeOnRoad()!=-1&&!messageList.get(i).isSystem())
			msg += messageList.get(i).toString() + "\n";
		}
		return msg;
	}

	public static void main(String[] args) {
		// test if message bus works
	}
}
